package cn.zyx.common.entity;

import cn.zyx.common.annotation.IgnoreSwaggerParameter;
import cn.zyx.common.utils.sys.IdGenUtils;
import cn.zyx.common.utils.sys.UserUtils;
import cn.zyx.sys.entity.User;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.Date;

/**
 * 数据Entity类
 * @author zyx
 * Serializable 序列化是将对象状态保存为一系列字节的过程，反序列化则是将这些字节恢复为原始对象的过程。
 * 当需要将对象保存到文件或数据库中，或者通过网络传输对象时，必须实现 Serializable 接口
 */
@Data
public abstract class DataEntity<T> implements Serializable {

	/**
	 * 设置serialVersionUID是一个固定的值
	 * 如果不自定义serialVersionUID的值，系统在序列化或者反序列化时会自动生成一个serialVersionUID
	 * 如果不设置serialVersionUID，在执行序列化操作时，修改了属性
	 * 序列化和反序列化生成的serialVersionUID不一致，会抛出nvalidClassException异常
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 删除标记（0：正常；1：删除；2：审核；）
	 */
	public static final String DEL_FLAG_NORMAL = "0";
	public static final String DEL_FLAG_DELETE = "1";
	public static final String DEL_FLAG_AUDIT = "2";

	/**
	 * 主键规则
	 */
	public static final String IDTYPE_UUID = "UUID";
	public static final String  IDTYPE_AUTO = "AUTO";


	/**
	 * 实体编号（唯一标识）
	 */
	protected String id;
	/**
	 * 当前实体分页对象
	 */
	@IgnoreSwaggerParameter
	protected Page<T> page;
	/**
	 * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
	 * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
	 */
	@IgnoreSwaggerParameter
	protected boolean isNewRecord = false;
	/**
	 * 主键策略（默认：UUID）
	 */
	@IgnoreSwaggerParameter
	protected String IdType = IDTYPE_UUID;
	protected String remarks;	// 备注
	@IgnoreSwaggerParameter
	protected User createBy;	// 创建者
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@IgnoreSwaggerParameter
	protected Date createDate;	// 创建日期
	@IgnoreSwaggerParameter
	protected User updateBy;	// 更新者
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@IgnoreSwaggerParameter
	protected Date updateDate;	// 更新日期
	@IgnoreSwaggerParameter
	protected String delFlag; 	// 删除标记（0：正常；1：删除；2：审核）
	@IgnoreSwaggerParameter
	protected Integer isDeal;   //是否处理 1处理 0未处理

	public DataEntity() {
		this.delFlag = DEL_FLAG_NORMAL;
	}

	public DataEntity(String id) {
		this();
		this.id = id;
		this.delFlag = DEL_FLAG_NORMAL;
	}

	/**
	 * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
	 * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
	 * @return
	 */
	@JsonIgnore
	public boolean getIsNewRecord() {
		return isNewRecord || StringUtils.isBlank(getId());
	}

	/**
	 * 插入之前执行方法，需要手动调用
	 */
	public void preInsert(){
		if (!this.isNewRecord){
			if(this.getIdType().equals(IDTYPE_UUID)){
				setId(IdGenUtils.uuid());
			} else if(this.getIdType().equals(IDTYPE_AUTO)){
				//使用自增长不需要设置主键
			}
		}
		User user = UserUtils.getUser();
		if (StringUtils.isNotBlank(user.getId())){
			this.updateBy = user;
			this.createBy = user;
		}
		this.updateDate = new Date();
		this.createDate = this.updateDate;
	}

	/**
	 * 更新之前执行方法，需要手动调用
	 */
	public void preUpdate(){
		User user = UserUtils.getUser();
		if (StringUtils.isNotBlank(user.getId())){
			this.updateBy = user;
		}
		this.updateDate = new Date();
	}


}
